package com.deng.crowd.mvc.handler;

import com.deng.crowd.entity.Menu;
import com.deng.crowd.service.api.MenuService;
import com.deng.crowd.util.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

// @ResponseBody
// @Controller
@RestController
public class MenuHandler {

    @Autowired
    private MenuService menuService;

    // @ResponseBody
    @RequestMapping("/menu/get/whole/tree.json")
    public ResultEntity<Menu> getWholeTree(){
        // 1.通过service层方法得到全部Menu对象的List
        List<Menu> menuList = menuService.getAll();

        // 2.声明一个Menu对象root，用来存放找到的根节点
        Menu root = null;

        // 3.使用map表示每一个菜单与id的对应关系
        Map<Integer,Menu> menuMap = new HashMap<>();

        // 4.将菜单id与菜单对象以K-V对模式存入map
        for(Menu menu: menuList){
            menuMap.put(menu.getId(),menu);
        }

        // 5.再次遍历 menuList 查找根节点、组装父子节点
        for (Menu menu : menuList){
            Integer pid = menu.getPid();

            if (pid == null){
                // 5.1 pid为null表示该menu是根节点
                root = menu;
                continue;
            }
            // 5.2 通过当前遍历的menu的pid得到其父节点
            Menu father = menuMap.get(pid);
            // 5.3 为父节点添加子节点为当前节点
            father.getChildren().add(menu);
        }

        // 将根节点作为data返回（返回根节点也就返回了整棵树）
        return ResultEntity.successWithData(root);
    }

    // @ResponseBody
    @RequestMapping("/menu/save.json")
    public ResultEntity<String> saveMenu(Menu menu) {
        menuService.saveMenu(menu);
        return ResultEntity.successWithoutData();
    }

    // @ResponseBody
    @RequestMapping("/menu/update.json")
    public ResultEntity<String> updateMenu(Menu menu) {
        menuService.updateMenu(menu);
        return ResultEntity.successWithoutData();
    }

    // @ResponseBody
    @RequestMapping("/menu/remove.json")
    public ResultEntity<String> removeMenu(@RequestParam("id") Integer id) {
        menuService.removeMenu(id);
        return ResultEntity.successWithoutData();
    }
}
